//!
/**
 ***********************************************************************************************************
 * <RBD3D9IndexBuffer Implementation>
 ***********************************************************************************************************
 * @file RBD3D9IndexBuffer.cpp
 ***********************************************************************************************************/

/***********************************************************************************************************
 * Precompiled Header
 ***********************************************************************************************************/
#include "RBD3D9RendererPCH.h"

/***********************************************************************************************************
 * Includes
 ***********************************************************************************************************/
#include "RBD3D9IndexBuffer.h"
#include "RBD3D9Renderer.h"
#include "RBD3D9Tools.h"

/***********************************************************************************************************
 * Defines
 ***********************************************************************************************************/

/***********************************************************************************************************
 * Classes implementation
 ***********************************************************************************************************/

/**
 ***********************************************************************************************************
 * Constructor
 ***********************************************************************************************************/
RBD3D9IndexBuffer::RBD3D9IndexBuffer(uint32 uiUsage, RBIndexBufferType::EType eIndexType, RBHardwareBufferManager* pCreator, uint32 uiIndexCount, const void* pInitData)
: RBIndexBuffer(uiUsage, MP_GPU | MP_CPU, pCreator, eIndexType, uiIndexCount)
, m_pD3DIB(NULL)
{
    uint32 uiLength = (eIndexType == RBIndexBufferType::IT_16BIT) ? uiIndexCount * sizeof(uint16) : uiIndexCount * sizeof(uint32);
    D3DFORMAT eD3DFormat = (eIndexType == RBIndexBufferType::IT_16BIT) ? D3DFMT_INDEX16 : D3DFMT_INDEX32;
    RBD3D9Renderer::GetSingleton()->GetD3DDevice()->CreateIndexBuffer(uiLength, RBD3D9Tools::ComputeD3DUsageFromRB(uiUsage), eD3DFormat, D3DPOOL_MANAGED, &m_pD3DIB, NULL);

    void* pMappedBuffer = Map(HBM_WRITE_DISCARD);
    memcpy_s(pMappedBuffer, uiLength, pInitData, uiLength);
    Unmap();
}

/**
 ***********************************************************************************************************
 * Destructor
 ***********************************************************************************************************/
RBD3D9IndexBuffer::~RBD3D9IndexBuffer()
{
    RBCommon::SafeRelease(m_pD3DIB);
}

/**************************************************************************************************************************************************************
 * 
 **************************************************************************************************************************************************************/
void* RBD3D9IndexBuffer::Map(MapType eMapType)
{
    void* pData = 0;
    if (FAILED(m_pD3DIB->Lock(0, 0, &pData, RBD3D9Tools::ComputeD3DMapFlagsFromRB(eMapType, this))))
    {
        return NULL;
    }
    return pData;
}

/**************************************************************************************************************************************************************
 * 
 **************************************************************************************************************************************************************/
void RBD3D9IndexBuffer::Unmap()
{
    m_pD3DIB->Unlock();
}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
void RBD3D9IndexBuffer::OnReset(bool)
{
    RBAssert(m_uiMemPoolMask & MP_CPU, "Index buffers are suposed to be in Managed mem");
}

/***********************************************************************************************************/
